小编典典

什么是“2的补码”?

all

如何使用它以及它如何在强制转换(从有符号到无符号,反之亦然)、按位运算和位移运算等操作期间影响数字.

我希望的是 一个清晰简洁的定义 ,程序员很容易理解。


阅读 519

收藏
2022-03-14

共1个答案

小编典典

二进制补码是一种存储整数的巧妙方法,因此常见的数学问题很容易实现。

要理解,您必须考虑二进制中的数字。

它基本上说,

  • 对于零,使用全 0。
  • 对于正整数,开始向上计数,最多为 2 (位数 - 1) -1。
  • 对于负整数,做完全相同的事情,但切换 0 和 1 的角色并倒计时(所以不是从 0000 开始,而是从 1111 开始 - 这是“补码”部分)。

让我们用一个 4 位的 mini-byte 来试试(我们称它为nibble
- 1/2 a byte)。

  • 0000- 零
  • 0001- 一
  • 0010- 二
  • 0011- 三
  • 01000111- 四到七

这就是我们所能达到的积极程度。2 3 -1 = 7。

对于底片:

  • 1111- 负一
  • 1110- 负二
  • 1101- 负三
  • 1100to 1000- 负四到负八

请注意,对于负数 ( 1000=
-8),您会得到一个额外的值,而对于正数则不会。这是因为0000用于零。这可以被认为是计算机的数线

区分正数和负数

这样做,第一位获得“符号”位的作用,因为它可以用来区分非负和负十进制值。如果最高有效位是1,那么二进制可以说是负数,如果最高有效位(最左边)是0,您可以说十进制值是非负数。

“符号幅度”负数只是将其正数对应的符号位翻转,但这种方法必须处理将1000(一个1后跟所有0s)解释为“负零”,这是令人困惑的。

“一个的补码”负数只是其正数的位补码,这也导致与1111(全为)混淆的“负零”。

除非您在非常靠近硬件的地方工作,否则您可能不必处理 Ones’ Complement 或 Sign-Magnitude 整数表示。

2022-03-14